#include"en-tete.h"
#include"serveur.h"
#include"fichier.h"
#include"communication.h"


#define  TAILLE 500

int main(void)

{
	#if defined (WIN32)
		WSADATA WSAData;
		int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
	#else
		int erreur = 0;
	#endif
	
	Liste liste;
	Sclient sclient;
	Stread stread;
	
	/*char texte[TAILLE];*/
	char  cmail[50],cmot_de_pass[50],cnom[50],cprenom[50];
	int sock_err,deconnexion=0,action=0;
	int numProcessus,testp,testm,boucleTest=0;
	
	
	pthread_t thread; /*initialisation d'un thread*/
	
	/*Declare la socket du client et cree sont contexte d'adressage*/
	SOCKADDR_IN csin;
	SOCKET csock;
	socklen_t Sockclisize = sizeof(csin);
	
	/*sur les trois ligne precedante, on marque la socket csock comme nom bloquante*/
	
	/*Declare la socket du serveur  et cree sont contexte d'adressage*/
	SOCKADDR_IN sin;
	SOCKET sock;
	socklen_t SockSersize = sizeof(sin);
	if(!erreur)
	{
		/*creation d'une socket*/
		sock = CreationSocket(AF_INET,SOCK_STREAM,0);
		
		/*si la socket est valide*/
		if(sock != INVALID_SOCKET)
		{
			
			/*printf("la socke %d est ouverte en mode TCP/IP\n",sock);*/
			
			/*configuration de la socket*/
			
			sin.sin_addr.s_addr = htonl(INADDR_ANY);/*Adresse IP automatique*/
			sin.sin_family = AF_INET;/*Protocole*/
			sin.sin_port = htons(PORT);/*listage des port*/
			/*Etablissemant de la connection*/
				sock_err =  Etablir_connection(sock,(SOCKADDR*)&sin,SockSersize);
			
				initialiser(&liste);
				chargemantDansListe(&liste);
				setThreadListe(&stread,liste);
				
				
				/*Si la socket fonctionnr*/
				if(sock_err != SOCKET_ERROR)
				{
					/*DEbut du listage (mode serveur) */
					sock_err = Mise_en_Ecoute(sock);
					/*printf("Listage du port %d ... \n",PORT);*/
					
					/*Si socket fonctionne */
					if(sock_err != SOCKET_ERROR)
					{	
						numProcessus = getpid();
						/*printf("numero Processus fork %d \n",numProcessus);*/
						
						while(deconnexion==0)
						/*boucle permetant au serveur d'accepte tout les client*/
						{	
							
							/* Attendre de la connection du client */
							/*printf("Connection d'un client au port %d ...\n",PORT);*/
							
							csock = Acceptation_demande_de_Connection(sock,(SOCKADDR*)&csin, &Sockclisize);/*Metre ici un thread*/
							printf("Un client se connecte avec la socket %d de %s : %d\n",csock,inet_ntoa(csin.sin_addr),htons(csin.sin_port));
							
							/*on recoit une structure et on fait les test*/
							/*reception de la structure sclient par le serveur pour faire les verification*/
							boucleTest=0;
							while(boucleTest==0)
							{
								
								if(recv(csock, &sclient, sizeof(sclient), 0) != SOCKET_ERROR)
								{	
									getcamail(&sclient,cmail);
									getcmotdepass(&sclient,cmot_de_pass);
									action=getaction(&sclient);
									if(action == 1)/*autentification d'un compte*/
									{
										testp =testPasswdMailValide(liste,cmot_de_pass,cmail,csock);
							
										if(testp == 1)
										{
											setaction(&sclient,3);
											/*setsocket(&sclient,csock);*/
											send(csock, &sclient, sizeof(sclient), 0);
											boucleTest++;
											
										}	
										else
										{
											printf("\nerreure d'autenfication\n");/*on renvoi le message d'erreure au client*/
											/*dans c cas de figure on ferme la socket*/
											printf("Fermeture de la socket client\n");
											send(csock, &sclient, sizeof(sclient), 0);
										}
									}
									else if (action == 2)
									{
										/*recoit la structure*/
										testm=testMailValide(liste,cmail);
						
										if(testm == 0)
										{
											getcnom(&sclient,cnom);
											getcprenom(&sclient,cprenom);
											
											ajouterEnQueue(&liste,getiannais(&sclient),cmail,cmot_de_pass,cnom,cprenom,csock);
											sauvegardeInfoCompte(getiannais(&sclient),cmail,cmot_de_pass,cnom,cprenom);
											setaction(&sclient,3);
											/*setsocket(&sclient,csock);*/
											send(csock, &sclient, sizeof(sclient), 0);
											boucleTest++;
										
							
										}
										else
										{
											printf("Le mail  existe deja \n");/*on revoi un message au client disant ke le mail existe deja*/
											/*dans c cas de figure on ferme la socket*/
											printf("Fermeture de la socket client\n");
											send(csock, &sclient, sizeof(sclient), 0);
										}
										
									}
								}	
								
							}
								/*ecrire la fonction envoi de message a tous le monde*/
							thread = rechercheThread(&liste,csock); /*on recupere le thread du client*/
							setThreadSocket(&stread,csock);
							
							pthread_create(&thread, NULL,creationTreadClient,(void *)&stread);
							
				

							/*on doit fermer ici les clients ilfaut le gtk pour cliquer sur le bouton deconnection*/
											/*
											if(deconnexionClient)
												Fermeture_de_la_socket(csock);
											
											shutdown(sock, 2);*/
							
						}	
						
					}
					else
						perror("listen");
				}
				else
					perror("bind");
				/*on doit pouvoir gerer la fermeture du serveur en activant fermeture_so...*/


				/*Fermeture de la socket client et de la socket serveur*/
				printf("Fermeture de la socket client\n");
				Fermeture_de_la_Socket(csock);
				printf("Fermeture de la socket serveur\n");
				Fermeture_de_la_Socket(sock);
				printf("ferneture de serveur terminee\n");
		}
		else
			perror("socket"); 
	}
	return 0;
}